<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS 中的 Object 类</title>
</head>
<body>
    <script type="text/javascript">
        // 1. Object 是所有类的超类, 自定义的类都继承自它
        // 2. Object 包括那些属性?
        //     prototype 属性(常用的, 主要是这个):作用是给类动态的扩展属性和函数
        //     constructor 属性
        // 3. Object 包括那些函数?
        //     toString()
        //     valueOf()
        //     toLocalString()
        // 4. 在 JS 中如何自定义类? 怎么 new 对象?
        //     定义类的语法:
        //         第一种:
        //         function 类名(参数列表) {
        //
        //         }
        //         第二种:
        //         类名 = function(形参列表) {
        //
        //         }
        //
        //     创造对象的语法:
        //         new 构造方法名(实参); // 构造方法名和类名一致
        function sayHello() {

        }
        // 这种方式将 sayHello 当成一个普通的函数
        sayHello();
        // 这种方式把它当做一个类处理
        // obj 是一个引用, 指向该对象
        var obj = new sayHello();

        // 例如
        function Student() {
            alert("student");
        }
        // 当成普通函数调用
        Student();
        // 当成类创建对象
        var stu = new Student();
        alert(stu); // 默认调用对象的 toString 方法, 打印结果为[object Object]


        // 类的定义同时又是一个构造函数的定义
        // JS 中类的定义和构造函数的定义是一起完成的
        function User(a, b, c) {
            this.sno = a;
            this.sname = b;
            this.sage = c;
        }
        // 创建对象
        var u1 = new User(1, "张三", 25);
        // 访问对象的属性
        alert(u1.sage);
        alert(u1.sname)
        alert(u1.sno);
        // 或者下面这个写法
        alert(u1["sage"]);
        alert(u1["sname"]);
        alert(u1["sno"]);

        Product = function (pno, panme, price) {
            // 属性
            this.pno = pno;
            this.pname = panme;
            this.price = price;
            // 函数
            this.getPrice = function () {
                return this.price;
            }
        }

        var pro1 = new Product();
        var pro2 = new Product(11);
        // 上面的两行也行, 不传参数时候给默认值 undefined
        var pro = new Product(111, "西瓜", 4.0);
        var pri = pro.getPrice();
        alert(pri);

        // 我们可以通过 prototype 这个属性来给类动态扩展属性和方法
        // 扩展方法
        Product.prototype.getPname = function () {
            return this.pname;
        }
        alert(pro.getPname());

        // 给字符串扩展函数
        String.prototype.suiyi = function () {
            alert("扩展函数")
        }
        "ABC".suiyi();
    </script>
</body>
</html>